package com.bitoon.basketdudes.web.xhr;

import com.bitoon.basketdudes.web.BaseAction;
import com.bitoon.basketdudes.web.jpa.Torneo;
import com.bitoon.basketdudes.web.datos.InfoCabeceraXHR;
import com.bitoon.basketdudes.web.datos.MensajeUsuario;
import com.bitoon.basketdudes.web.jpa.Equipo;
import com.bitoon.basketdudes.web.jpa.Participe;
import com.bitoon.basketdudes.web.jpa.ParticipePK;
import com.bitoon.basketdudes.web.jpa.Temporada;
import com.bitoon.basketdudes.web.jpa.Usuario;

import java.util.*;
import javax.persistence.*;
import org.apache.log4j.Logger;
import org.hibernate.Hibernate;

public class ListaParticipes extends BaseAction {
    
    private List<Participe> datos;
    private InfoCabeceraXHR cabecera;
    private int pagina = 1;
    private int cuantos;

    // Parámetros de búsqueda por torneoUrl
    private String urlTorneo;
    private String equipo;

    private Logger log = Logger.getLogger(ListaParticipes.class);

    public String execute() {
        String retorno = SUCCESS;

        EntityManager em = null;

        try {
            em = emfBasket.createEntityManager(); // checked

            Query q = em.createNamedQuery("Torneo.findByNombreUrl");
            q.setParameter("nombreUrl", urlTorneo);
            Torneo torneo = (Torneo)q.getSingleResult();

            q = em.createNamedQuery("Temporada.findTemporadaActivaByTorneoId");
            q.setParameter("id", torneo.getId());
            q.setMaxResults(1);
            Temporada temporada = (Temporada)q.getSingleResult();

            q = em.createNamedQuery("Participe.findByTemporadaIdEstado");
            q.setParameter("temporadaId", temporada.getId());
            q.setParameter("estado", (short)0); // Petición

            int totalRegistros = q.getResultList().size();
            int totalPaginas = (totalRegistros-1)/LISTADO_INSCRITOS_ELEMENTOS_POR_PAGINA + 1;

            log.debug("pagina: " + getPagina());

            setCabecera(new InfoCabeceraXHR());
            getCabecera().setCorrecto(1);
            getCabecera().setActual(getPagina());
            getCabecera().setTotal(totalPaginas);

            int p1=0, p2=0;

            if (getPagina() <= (LISTADO_INSCRITOS_HUECOS_LADO_PAGINA+1)) {
                p1 = 1;
                p2 = LISTADO_INSCRITOS_HUECOS_LADO_PAGINA*2 + 1;
            } else if (getPagina() >= (totalPaginas-LISTADO_INSCRITOS_HUECOS_LADO_PAGINA)) {
                p1 = totalPaginas - (LISTADO_INSCRITOS_HUECOS_LADO_PAGINA*2);
                p2 = totalPaginas;
            } else {
                p1 = getPagina() - LISTADO_INSCRITOS_HUECOS_LADO_PAGINA;
                p2 = getPagina() + LISTADO_INSCRITOS_HUECOS_LADO_PAGINA;
            }
            if (p1 < 1) {
                p1 = 1;
            }
            if (p2 > totalPaginas) {
                p2 = totalPaginas;
            }
            getCabecera().setPrimeraPagina(p1);
            getCabecera().setUltimaPagina(p2);

            log.debug("cabecera.actual: " + getCabecera().getActual());
            log.debug("cabecera.total: " + getCabecera().getTotal());

            int offset = (pagina-1) * LISTADO_INSCRITOS_ELEMENTOS_POR_PAGINA;
            q.setFirstResult(offset);
            q.setMaxResults(LISTADO_INSCRITOS_ELEMENTOS_POR_PAGINA);

            setDatos((List<Participe>)q.getResultList());

            getCabecera().setActual(getPagina());
        } catch (NoResultException nre) {
            log.debug("No se ha encontrado el torneo " + urlTorneo);
        } catch (Exception e) {
            log.error(e);
            retorno = ERROR;
        } finally {
            try { em.close(); } catch (Exception e) { }
        }

        return retorno;
    }


    public String borrar() {
        String retorno = SUCCESS;

        InfoCabeceraXHR cabecera = new InfoCabeceraXHR();
        EntityManager em = null;

        try {
            em = emfBasket.createEntityManager(); // checked

            Query q = em.createNamedQuery("Equipo.findByNombreUrl");
            q.setParameter("nombre", equipo);
            Equipo equipoBorrar = (Equipo)q.getSingleResult();

            // Sólo se podrá borrar si el usuario logado es dueño del equipo
            // o el usuario logado es el administrador del torneo

            log.debug("Borrar equipo de torneo ...");
            log.debug(equipoBorrar.getUsuario().getId());
            log.debug(getUsuarioLogado().getId());
            log.debug("===============================================");

            q = em.createNamedQuery("Torneo.findByNombreUrl");
            q.setParameter("nombreUrl", urlTorneo);
            Torneo torneo = (Torneo)q.getSingleResult();

            if ( (equipoBorrar.getUsuario().getId().equals(getUsuarioLogado().getId()))
            || (getUsuarioLogado().getId().equals(torneo.getUsuario().getId()) ) ) {

                log.debug("Se va a borrar al equipo " + equipo + " del torneo " + urlTorneo);

                q = em.createNamedQuery("Temporada.findTemporadaActivaByTorneoId");
                q.setParameter("id", torneo.getId());
                q.setMaxResults(1);
                Temporada temporada = (Temporada)q.getSingleResult();

                Query qa = em.createNativeQuery("delete from participe where temporada_id = "
                        + temporada.getId() + " and equipo_id = " + equipoBorrar.getId());
                em.getTransaction().begin();
                qa.executeUpdate();
                em.getTransaction().commit();

                cabecera.setCorrecto(1);

                // Mandar mensaje de expulsión

                MensajeUsuario mens = new MensajeUsuario();
                if (equipoBorrar.getUsuario().getId().equals(getUsuarioLogado().getId())) {
                    // El usuario se ha borrado, se manda un mensaje al administrador
                    mens.setFrom("BasketDudes");
                    mens.setSender(0);
                    mens.setTo(torneo.getUsuario().getNickMostrar());
                    mens.setReceiver(torneo.getUsuario().getId());
                    mens.setTipoDestinatario(MensajeUsuario.TIPO_USUARIO_NORMAL);
                    mens.setTipoUsuarioEmisor(MensajeUsuario.TIPO_USUARIO_ADMINISTRADOR_WEB);
                    mens.setAsunto(getText("mensaje_interno.torneos_de_usuario.autoExpulsion_antes_inicio.titulo."+torneo.getUsuario().getIdioma().toLowerCase()));
                    List<Object> params = new ArrayList<Object>();
                    params.add(torneo.getNombre());
                    params.add(torneo.getNombreUrl());
                    params.add(equipoBorrar.getNombreCompleto());
                    mens.setTexto(getText("mensaje_interno.torneos_de_usuario.autoExpulsion_antes_inicio.mensaje."+torneo.getUsuario().getIdioma().toLowerCase(),params));
                } else {
                    //  El administrador ha borrado el equipo, se manda un mensaje al manager del equipo
                    mens.setFrom("BasketDudes");
                    mens.setSender(0);
                    mens.setTo(torneo.getUsuario().getNickMostrar());
                    mens.setReceiver(equipoBorrar.getUsuario().getId());
                    mens.setTipoDestinatario(MensajeUsuario.TIPO_USUARIO_NORMAL);
                    mens.setTipoUsuarioEmisor(MensajeUsuario.TIPO_USUARIO_ADMINISTRADOR_WEB);
                    mens.setAsunto(getText("mensaje_interno.torneos_de_usuario.expulsion_antes_inicio.titulo."+torneo.getUsuario().getIdioma().toLowerCase()));
                    List<Object> params = new ArrayList<Object>();
                    params.add(torneo.getNombre());
                    params.add(torneo.getNombreUrl());
                    params.add(equipoBorrar.getNombreCompleto());
                    mens.setTexto(getText("mensaje_interno.torneos_de_usuario.expulsion_antes_inicio.mensaje."+torneo.getUsuario().getIdioma().toLowerCase(),params));
                }

                escribirMensaje(mens);
            } else {
                cabecera.setCorrecto(1); // La llamada es correcta, aunque no se haga nada
            }
        } catch (NoResultException nre) {
            log.debug("No se ha encontrado el torneo " + urlTorneo);
            cabecera.setCorrecto(0);
        } catch (Exception e) {
            log.error(e);
            retorno = ERROR;
            cabecera.setCorrecto(0);
        } finally {
            setCabecera(cabecera);
            try { if (em.getTransaction().isActive()) { em.getTransaction().rollback(); }; } catch (Exception e) { }
            try { em.close(); } catch (Exception e) { }
        }

        return retorno;
    }



    public List<Participe> getDatos() {
        return datos;
    }

    public void setDatos(List<Participe> datos) {
        this.datos = datos;
    }

    public InfoCabeceraXHR getCabecera() {
        return cabecera;
    }

    public void setCabecera(InfoCabeceraXHR cabecera) {
        this.cabecera = cabecera;
    }

    public int getPagina() {
        return pagina;
    }

    public void setPagina(int pagina) {
        this.pagina = pagina;
    }

    public int getCuantos() {
        return cuantos;
    }

    public void setCuantos(int cuantos) {
        this.cuantos = cuantos;
    }

    public String getUrlTorneo() {
        return urlTorneo;
    }

    public void setUrlTorneo(String torneo) {
        this.urlTorneo = torneo;
    }

    public String getEquipo() {
        return equipo;
    }

    public void setEquipo(String equipo) {
        this.equipo = equipo;
    }


}
